﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace Axe.ComponentModel
{
    public class BindingTypeConverterEventArgs : EventArgs
    {
        ITypeDescriptorContext m_context;
        Collection<object> m_StandartValues = new Collection<object>();

        public Collection<object> StandartValues
        {
            get { return m_StandartValues; }
            set { m_StandartValues = value; }
        }

        public ITypeDescriptorContext Context
        {
          get { return m_context; }
          set { m_context = value; }
        }

        public BindingTypeConverterEventArgs(ITypeDescriptorContext ctx)
            : base()
        {
            Context=ctx;
        }
    }

    public abstract class BindingTypeConverterBase : TypeConverter
    {
        /// <summary>
        /// Будем предоставлять выбор из списка
        /// </summary>
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        /// <summary>
        /// ... и только из списка
        /// </summary>
        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            // false - можно вводить вручную
            // true - только выбор из списка
            return true;
        }

        /// <summary>
        /// А вот и список
        /// </summary>
        public override abstract StandardValuesCollection GetStandardValues(ITypeDescriptorContext context);
    }

    /// <summary>
    /// TypeConverter для выбора значения из выпадающего списка, формируемого программно
    /// </summary>
    public class BindingTypeConverter : BindingTypeConverterBase
    {
        /// <summary>
        /// А вот и список
        /// </summary>
        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            return OnBinding(context);
        }

        protected virtual StandardValuesCollection OnBinding(ITypeDescriptorContext ctx)
        {
            BindingTypeConverterEventArgs args = new BindingTypeConverterEventArgs(ctx);

            if (Binding != null)
            {
                Binding(this, args);
            }

            return new StandardValuesCollection(args.StandartValues);
        }

        public static event EventHandler<BindingTypeConverterEventArgs> Binding; 
    }
}
